package Tree;

import java.util.LinkedList;
import java.util.List;
import java.util.Queue;

/**
 * 513.找树左下角的值
 * 给定一个二叉树的 根节点 root，请找出该二叉树的 最底层 最左边 节点的值。
 * 假设二叉树中至少有一个节点。
 */
public class findBottomLeftValue {
    //一刷
    public int findBottomLeftValue(TreeNode root) {
        if(root == null) return 0;
        List<List<Integer>> list = new LinkedList<>();

        Queue<TreeNode> queue = new LinkedList<TreeNode>();
        queue.add(root);
        while(!queue.isEmpty()) {
            int size = queue.size();
            List<Integer> list1 = new LinkedList<>();
            for(int i = 0; i < size; i++) {
                TreeNode node = queue.poll();
                if(node.left != null) queue.add(node.left);
                if(node.right != null) queue.add(node.right);
                list1.add(node.val);
            }
            list.add(list1);
        }
        return list.getLast().getFirst();
    }

    /**
     * 二刷
     */
    public int findBottomLeftValue2(TreeNode root) {
        if (root == null)
            return 0;
        if (root.left == null && root.right == null) {
            return root.val;		//中
        }
        int l = 0;
        int r = 0;
        if (root.left != null) {
            l = getHeight(root.left);
        }
        if (root.right != null) {
            r = getHeight(root.right);
        }
        if (l >= r) {
            return findBottomLeftValue(root.left);//左
        } else {
            return findBottomLeftValue(root.right);//右
        }
    }

    public int getHeight(TreeNode root) {
        if (root == null)
            return 0;
        return Math.max(getHeight(root.left), getHeight(root.right)) + 1;
    }
}
